// function matrixChange(matrix) {
//   if (matrix.length === 0) {
//     return []
//   }
//   let l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1
//   const res = []
//   while (true) {
//     // left -> right
//     for (let i = l; i <= r; i++) {
//       res.push(matrix[t][i])
//     }
//     if (++t > b) break
//     // top -> bottom
//     for (let i = t; i <= b; i++) {
//       res.push(matrix[i][r])
//     }
//     if (--r < l) break
//     // right -> left
//     for (let i = r; i >= l; i--) {
//       res.push(matrix[b][i])
//     }
//     if (--b < t) break
//     // bottom -> top
//     for (let i = b; i >= t; i--) {
//       res.push(matrix[i][l])
//     }
//     if (++l > r) break
//   }
//   return res
// }

// function isDaXianWinner(n) {

// }

function getExitCount(maze) {
  let m = maze.length;
  let n = maze[0].length;
  let count = 0;
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (maze[i][j] === 'S') {
        dfs(i, j);
        return count;
      }
    }
  }
  function dfs(i, j) {
    if (i < 0 || j < 0 || i >= m || j >= n || maze[i][j] === 'X') {
      return;
    }
    if (maze[i][j] === 'E') {
      count++;
      maze[i][j] = 'O';
    }
    let c = maze[i][j];
    maze[i][j] = 'X';
    dfs(i + 1, j);
    dfs(i - 1, j);
    dfs(i, j + 1);
    dfs(i, j - 1);
    maze[i][j] = c;
  }
}

const maze = [['O', 'O', 'O', 'O', 'S'], ['O', 'X', 'O', 'X', 'X'], ['O', 'O', 'X', 'O', 'E'], ['X', 'X', 'O', 'X', 'O'], ['E', 'O', 'O', 'O', 'O']]
console.log(maze);
console.log(getExitCount(maze));

// function isDaXianWinner(n) {
//   let count = 0;
//   function dfs(n) {
//     if (n <= 0) {
//       if (count % 2 === 0) {
//         return false
//       } else {
//         return true;
//       }
//     }
//     let num = 0;
//     if (n === 1) {
//       num = 1;
//     } else {
//       num = Math.floor(Math.log2(n)) * 2;
//     }
//     n = n - num;
//     count++;
//     return dfs(n);
//   }
//   return dfs(n);
// }

// console.log(isDaXianWinner(1));